package gruppo12.msp;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import gruppo12.msp.R;
import gruppo12.msp.elaboration.Categoria;
import gruppo12.msp.elaboration.Elaborazione;
import gruppo12.msp.elaboration.MappaCategorie;
import gruppo12.msp.elaboration.Pianificazione;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;

/**
 * <p>
 * Classe che implementa l'interfaccia relativa alla visualizzazione della
 * selezione delle categorie
 * </p>
 * 
 * @author Duca Antonio, Festa Jacopo, Fiorilli Domenico, Granese Dante, Lemma
 *         Saverio, Lombardi Marco e Pierno Fiore
 * 
 */
public class SelezioneCategorieActivity extends Activity {

	private ArrayList<Categoria> listaCategorieDaPassare;
	private Elaborazione elaborazione;
	private Pianificazione pianificazione;
	private Button bottoneProsegui;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		/* Dichiarazioni */
		Intent intent;
		String pkg;
		Resources res;
		HashMap<String, String> hashMapIngIta;
		ArrayList<Categoria> listaCategorie;
		Iterator<Categoria> iteratoreCategorie;
		Iterator<String> iteratoreMacroPassate;
		CheckBox checkBoxSelezionaTutto;
		MappaCategorie mappaCategorie;
		String stringaMacroPassate;
		LinearLayout layoutCategorie;
		final ArrayList<CheckBox> listaCheckBox;
		final ArrayList<String> listaMacroPassate;

		/* Recupero dei dati della precedente schermata */
		intent = getIntent();
		pkg = getPackageName();
		res = getResources();
		listaMacroPassate = intent.getStringArrayListExtra(pkg + ".macro");
		elaborazione = (Elaborazione) intent.getSerializableExtra(pkg
				+ ".elaborazione");
		pianificazione = (Pianificazione) intent.getSerializableExtra(pkg
				+ ".pianificazione");

		/* Associazione con gli oggetti grafici dell'xml */
		setContentView(R.layout.selezionecategorie);
		layoutCategorie = (LinearLayout) findViewById(R.id.linearLayoutSelCatCheckbox);
		bottoneProsegui = (Button) this.findViewById(R.id.buttonProsegui);
		checkBoxSelezionaTutto = (CheckBox) findViewById(R.id.checkBoxAll);

		/* Inizializzazioni variabili */
		hashMapIngIta = new HashMap<String, String>();
		listaCategorieDaPassare = new ArrayList<Categoria>();
		listaCheckBox = new ArrayList<CheckBox>();
		mappaCategorie = new MappaCategorie(res);
		hashMapIngIta = mappaCategorie.getIngIta();
		iteratoreMacroPassate = listaMacroPassate.iterator();

		/* Controllo l'inserimento delle informazioni minime necessarie */
		controlloInserimentoInformazioniBottone();

		/* Bottone per la selezione di tutti i checkBox */
		checkBoxSelezionaTutto
				.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						/*
						 * CheckBox c;
						 * 
						 * if (isChecked) while (iteratoreCheckBox.hasNext()) {
						 * c = iteratoreCheckBox.next(); c.setChecked(true); }
						 * 
						 * else if (!isChecked) while
						 * (iteratoreCheckBox.hasNext()) { c =
						 * iteratoreCheckBox.next(); c.setChecked(false); }
						 */

						int i;
						if (isChecked)
							for (i = 0; i < listaCheckBox.size(); i++)
								listaCheckBox.get(i).setChecked(true);

						else if (!isChecked)
							for (i = 0; i < listaCheckBox.size(); i++)
								listaCheckBox.get(i).setChecked(false);

						controlloInserimentoInformazioniBottone();
					}
				});

		/* Ciclo per la creazione dinamica dell'interfaccia */
		while (iteratoreMacroPassate.hasNext()) {
			stringaMacroPassate = iteratoreMacroPassate.next();

			/*
			 * Prelievo delle categorie appartenenti alla relativa macro
			 * selezionata
			 */
			listaCategorie = mappaCategorie.getCategorie(stringaMacroPassate);
			iteratoreCategorie = listaCategorie.iterator();
			while (iteratoreCategorie.hasNext()) {
				final Categoria categoria = (Categoria) iteratoreCategorie
						.next();
				final CheckBox checkBox = new CheckBox(this);
				TextView textViewSeparatore = new TextView(this);

				/* Set del nome della categoria nella check */
				checkBox.setText(hashMapIngIta.get(categoria.getNomeCategoria())
						+ "\n" + categoria.getMacroCategoria());
				checkBox.setTextSize(15);
				checkBox.setId(categoria.hashCode());

				/* Associazione dell'oggetto da modellare all'oggetto grafico */
				checkBox.setTag(categoria);

				/* Generazione della linea di separazione per ogni checkbox */
				textViewSeparatore.setBackgroundColor(Color.BLACK);
				textViewSeparatore.setHeight(2);
				layoutCategorie.addView(textViewSeparatore);
				listaCheckBox.add(checkBox);

				/* Aggiunta della checkbox nel linearlayout */
				layoutCategorie.addView(checkBox);

				/* Listener checkbox */
				checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						if (isChecked) {
							categoria.setCategoriaSelezionata(true);
							listaCategorieDaPassare.add(categoria);
							controlloInserimentoInformazioniBottone();
						} else if (!isChecked) {
							if (listaCategorieDaPassare.contains(categoria)) {
								listaCategorieDaPassare.remove(categoria);
								controlloInserimentoInformazioniBottone();
							}
						}
					}
				});

			}

		}

		/* Listener del button bottoneProsegui */
		bottoneProsegui.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startBarreGraficheActivity();
			}
		});
	}

	/**
	 * <p>
	 * Metodo che effettua il controllo sulle informazioni inserite dall'utente
	 * </p>
	 * 
	 * @return true se vengono inserite tutte le informazioni in maniera
	 *         corretta
	 */
	private boolean controlloInserimentoInformazioni() {
		if (listaCategorieDaPassare.isEmpty())
			return false;
		else
			return true;
	}

	/**
	 * <p>
	 * Metodo che effettua il controllo sull'abilitazione del pulsante
	 * buttonProsegui
	 * </p>
	 */
	private void controlloInserimentoInformazioniBottone() {
		boolean verifica = controlloInserimentoInformazioni();
		/* Caso parametri inseriti correttamente */
		if (verifica)
			bottoneProsegui.setCompoundDrawablesWithIntrinsicBounds(
					R.drawable.arrow_right_icon, 0, 0, 0);
		/* Caso parametri non inseriti correttamente */
		else
			bottoneProsegui.setCompoundDrawablesWithIntrinsicBounds(
					R.drawable.arrow_right_icon_disabled, 0, 0, 0);
		/* Abilitazione o non del bottone in base ai parametri */
		bottoneProsegui.setEnabled(verifica);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alle Barre Grafiche
	 * </p>
	 */
	private void startBarreGraficheActivity() {
		Intent intent = new Intent(this, BarreGraficheActivity.class);
		String pkg = getPackageName();
		elaborazione.setListaCategorie(listaCategorieDaPassare);
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);
		startActivity(intent);
	}
}